package com.wongoing.bus.util;

import java.util.Date;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import com.wongoing.util.CommonUtils;
import com.wongoing.util.DateConvert;
import com.wongoing.util.DateStyle;
import com.wongoing.util.LogService;
import com.wongoing.util.ResourceUtil;
@Component 
public class SequenceBuilder {
	
	private static SequenceBuilder instance;
//	private PassOrderService passOrderService;
//	@Autowired
//	public void setPassOrderService(PassOrderService passOrderService) {
//		this.passOrderService = passOrderService;
//	}
//	public SequenceBuilder() {
//		super();
//	}
//	@PostConstruct
//    public void init() {  
//		instance = this;  
//		instance.passOrderService = this.passOrderService;  
//  
//    }  
	public synchronized static SequenceBuilder getInstance() {
		if (instance == null) {
			instance = new SequenceBuilder();
		}
		return instance;
	}
	


	/**
	 * 功能说明：
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2017年10月25日 下午4:39:59
	 * @param datetime
	 * @return 2017102415
	 */
	public static String getDatePrefix(Date datetime) {
		String result = null;
		try {
			String date = DateConvert.formatDateToString(new Date(), DateStyle.YYYYMMDD);
			String time = CommonUtils.fillZeroBeforeString(DateConvert.getHour(datetime)+"", 2);
			result = date+time;
		} catch (Exception e) {
			LogService.getInstance().debug("序列号时间前缀产生错误！"+e.getMessage());
		}
		return result;
	};
	
	/**
	 * 功能说明：获取服务号码10(日月年)+2(产品号)+2(服务项目号)+5(流水)[默认为正常订单类型编号]
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2017年10月25日 下午4:39:59
	 * @param productNum
	 * @param serveNum
	 * @param serialNum
	 * @return 20180102 01 04 01 1229004
	 */
	public synchronized String getOrderNumByNow(String businessNum,String levelNum, String serialNum) {
		String result = null;
		try {
			serialNum = CommonUtils.fillZeroBeforeString(serialNum, 6);
			serialNum = serialNum.substring(0, 6);
			String tmpOrderType = CommonUtils.fillZeroBeforeString(Constants.ORDER_NORMAL.toString(), 2);
			result = getDatePrefix(new Date()) +  businessNum + levelNum + tmpOrderType + serialNum;
			String devMode = ResourceUtil.getDevMode();
			if(StringUtils.isNotBlank(devMode) && "true".equals(devMode)){
				result = "1" + result.substring(1);
			}
		} catch (Exception e) {
			LogService.getInstance(this).debug("序列号时间前缀产生错误！"+e.getMessage());
		}
		return result;
	};
	/**
	 * 
	 * 功能说明：获取服务号码10(日月年)+2(产品号)+2(服务项目号)+5(流水)[默认为正常子订单类型编号]
	 * 修改说明：
	 * @author 袁海洋
	 * @date 2018年6月29日 下午4:04:50
	 * @param productNum
	 * @param serveNum
	 * @param serialNum
	 * @return
	 */
	public synchronized String getOrderSonNumByNow(String businessNum,String levelNum, String serialNum) {
		String result = null;
		try {
			serialNum = CommonUtils.fillZeroBeforeString(serialNum, 6);
			serialNum = serialNum.substring(0, 6);
			String tmpOrderType = CommonUtils.fillZeroBeforeString(Constants.ORDER_NORMAL.toString(), 2);
			result =  getDatePrefix(new Date()) +  businessNum + levelNum + tmpOrderType + serialNum;
			String devMode = ResourceUtil.getDevMode();
			if(StringUtils.isNotBlank(devMode) && "true".equals(devMode)){
				result = "1" + result.substring(1);
			}
		} catch (Exception e) {
			LogService.getInstance(this).debug("序列号时间前缀产生错误！"+e.getMessage());
		}
		return result;
	};
	/**
	 * 功能说明：获取服务号码10(日月年时)+2(产品号)+2(服务项目号)+2(订单类型)+6(流水)[需传入订单类型编号]
	 * 修改说明：用来区别是正常订单还是退款订单号
	 * @author 吴兆强
	 * @date 2017年12月11日 上午8:53:15
	 * @param productNum
	 * @param serveNum
	 * @param orderType
	 * @param serialNum
	 * @return
	 */
	public synchronized String getOrderNumByNow(String productNum,Integer serveNum, Integer orderType, String serialNum) {
		String result = null;
		try {
			String tmpServeNum = CommonUtils.fillZeroBeforeString(serveNum.toString(), 2);
			serialNum = CommonUtils.fillZeroBeforeString(serialNum, 6);
			serialNum = serialNum.substring(0, 6);
			String tmpOrderType = CommonUtils.fillZeroBeforeString(orderType.toString(), 2);
			result = getDatePrefix(new Date()) +  productNum + tmpServeNum + tmpOrderType + serialNum;
		} catch (Exception e) {
			LogService.getInstance(this).debug("序列号时间前缀产生错误！"+e.getMessage());
		}
		return result;
	};
	
	/**
	 * 功能说明：获取服务号码10(日月年时)+2(产品号)+2(服务项目号)+6(流水)【默认增加退款订单标识】
	 * 修改说明：未增加访问效率，将订单号与退款号生成方法分离
	 * @author 吴兆强
	 * @date 2017年12月11日 上午12:03:08
	 * @param productNum
	 * @param serveNum
	 * @param serialNum
	 * @return
	 */
	public synchronized String getOrderRefundNumByNow(Integer refundType, String serialNum) {
		String result = null;
		try {
			String tmpServeNum = CommonUtils.fillZeroBeforeString(refundType.toString(), 2);
			serialNum = CommonUtils.fillZeroBeforeString(serialNum, 6);
			serialNum = serialNum.substring(0, 6);
			String tmpRefundNum = CommonUtils.fillZeroBeforeString(Constants.ORDER_REFUND.toString(), 2);
			result = getDatePrefix(new Date())  + tmpServeNum + tmpRefundNum + serialNum;
		} catch (Exception e) {
			LogService.getInstance(this).debug("序列号时间前缀产生错误！"+e.getMessage());
		}
		return result;
	}
	/**
	 * 功能说明：支付宝退款批次号生成
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年3月4日 下午2:24:07
	 * @param productNum
	 * @param serveNum
	 * @param serialNum
	 * @return
	 */
	public synchronized String getAlipayRefundBatchNoByNow(Integer refundType, String serialNum) {
		String result = null;
		try {
			String tmpServeNum = CommonUtils.fillZeroBeforeString(refundType.toString(), 2);//服务号
			serialNum = CommonUtils.fillZeroBeforeString(serialNum, 6);//流水号
			serialNum = serialNum.substring(0, 6);
			String tmpRefundNum = CommonUtils.fillZeroBeforeString(Constants.ORDER_REFUND.toString(), 2);
			String tmpRefundNumAlipay = CommonUtils.fillZeroBeforeString(Constants.ORDER_REFUND_ALIAY.toString(), 2);
			result = getDatePrefix(new Date())  + tmpServeNum + tmpRefundNum + tmpRefundNumAlipay + serialNum;
		} catch (Exception e) {
			LogService.getInstance(this).debug("支付宝退款批次号生成错误！"+e.getMessage());
		}
		return result;
	}
	/**
	 * 功能说明：获取服务号码10(日月年时)+2(产品号)+2(服务项目号)+6(流水)【需传入退款订单标识】
	 * 修改说明：未增加访问效率，将订单号与退款号生成方法分离
	 * @author 吴兆强
	 * @date 2017年12月11日 上午12:03:08
	 * @param productNum
	 * @param serveNum
	 * @param serialNum
	 * @return
	 */
//	public synchronized String getOrderRefundNumByNow(String productNum,Integer serveNum, String refundNum, String serialNum) {
//		String result = null;
//		try {
//			//String tmpServeNum = CommonUtils.fillZeroBeforeString(serveNum.toString(), 2);
//			serialNum = CommonUtils.fillZeroBeforeString(serialNum, 3);
//			refundNum = CommonUtils.fillZeroBeforeString(refundNum, 2);
//			result = getDatePrefix(new Date())  + serialNum;
//		} catch (Exception e) {
//			LogService.getInstance(this).debug("序列号时间前缀产生错误！"+e.getMessage());
//		}
//		return result;
//	}
	
	/**
	 * 功能说明：获取服务号码
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2017年10月25日 下午4:39:59
	 * @param datetime
	 * @return 2017102415
	 */
	public synchronized String getServeSequence() {
		String serveSequence = null;
		try {
			serveSequence = RandomStringUtils.random(9, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
			LogService.getInstance(this).debug("生成服务号码成功！");
		} catch (Exception e) {
			LogService.getInstance(this).debug("生成服务号码错误！"+e.getMessage());
		}
		return serveSequence;
	}
	
	
	/**
	 * 
	 * 功能说明：优惠券前缀生成规则
	 * 修改说明：
	 * @author KaneYang
	 * @date 2017年11月16日 下午2:00:57
	 * @return
	 */
	public synchronized String getCouponSequence() {
		String couponSequence = null;
		try {
			couponSequence = RandomStringUtils.random(5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
			LogService.getInstance(this).debug("生成服务号码成功！");
		} catch (Exception e) {
			LogService.getInstance(this).debug("生成服务号码错误！"+e.getMessage());
		}
		return couponSequence;
	}
	
	/**
	 * 功能说明：邮箱激活code
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2017年12月22日 下午3:11:46
	 * @return
	 */
	public synchronized String getEmailActivedCode(){
		String code = null;
		try {
			code = RandomStringUtils.random(6, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
			LogService.getInstance(this).debug("生成服务号码成功！");
		} catch (Exception e) {
			LogService.getInstance(this).debug("生成服务号码错误！"+e.getMessage());
		}
		return code;
	}
	
	/**
	 * 功能说明：获取随机码
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年1月9日 下午5:04:56
	 * @param count
	 * @return
	 */
	public synchronized String getRandomCode(int count) {
		String code = null;
		try {
			code = RandomStringUtils.random(count, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
			LogService.getInstance(this).debug("生成随机码！");
		} catch (Exception e) {
			LogService.getInstance(this).debug("随机码失败："+e.getMessage());
		}
		return code;
	}
	
	/**
	 * 功能说明：获取随机码
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年1月9日 下午5:05:16
	 * @param count 返回随机数的个数
	 * @param chars 生成随机码的
	 * @return
	 */
	public synchronized String getRandomCode(int count, String chars) {
		String code = null;
		try {
			code = RandomStringUtils.random(count, chars);
			LogService.getInstance(this).debug("生成随机码！");
		} catch (Exception e) {
			LogService.getInstance(this).debug("随机码失败："+e.getMessage());
		}
		return code;
	}
}
